package com.example.doublepointer;

/**
 * @author wxz
 * 581. 最短无序连续子数组  hot100
 * 给你一个整数数组 nums ，你需要找出一个 连续子数组 ，如果对这个子数组进行升序排序，那么整个数组都会变为升序排序。
 * <p>
 * 请你找出符合题意的 最短 子数组，并输出它的长度。
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [2,6,4,8,10,9,15]
 * 输出：5
 * 解释：你只需要对 [6, 4, 8, 10, 9] 进行升序排序，那么整个表都会变为升序排序。
 * 示例 2：
 * <p>
 * 输入：nums = [1,2,3,4]
 * 输出：0
 */
public class ShortestUnsortedContinuousSubarray {
    public static void main(String[] args) {
        ShortestUnsortedContinuousSubarray shortestUnsortedContinuousSubarray = new ShortestUnsortedContinuousSubarray();
        int[] n = {2, 6, 4, 8, 10, 9, 15};
        shortestUnsortedContinuousSubarray.findUnsortedSubarray(n);
    }

    public int findUnsortedSubarray(int[] nums) {
        int n = nums.length;
        int maxn = Integer.MIN_VALUE, right = -1;
        int minn = Integer.MAX_VALUE, left = -1;
        for (int i = 0; i < n; i++) {
            //从前往后遍历更新右边界
            if (maxn > nums[i]) {//如果当前最大值大于遍历元素，说明当前遍历元素的位置有问题，所以需要记录更新右边界
                right = i;
            } else {//如果当前最大值小于遍历元素，说明当前遍历元素的位置没问题，是个正常的升序，更新最大值
                maxn = nums[i];
            }
            //从前往后遍历更新左边界
            if (minn < nums[n - i - 1]) {//如果当前最小值小于遍历元素，说明当前遍历元素的位置有问题，所以需要记录更新左边界
                left = n - i - 1;
            } else {//如果当前最小值大于于遍历元素，说明当前遍历元素的位置没问题，所以需要更新最小值
                minn = nums[n - i - 1];
            }
        }
        return right == -1 ? 0 : right - left + 1;
    }
}
